package com.wande.dataplatform.service;

import com.wande.common.mybatis.core.page.PageQuery;
import com.wande.common.mybatis.core.page.TableDataInfo;
import com.wande.dataplatform.domain.bo.ProjectBo;
import com.wande.dataplatform.domain.bo.ProjectMemberBo;
import com.wande.dataplatform.domain.dto.ProjectResourceStatisticsDTO;
import com.wande.dataplatform.domain.vo.ProjectMemberVO;
import com.wande.dataplatform.domain.vo.ProjectVO;

import java.util.List;

/**
 * 项目服务接口
 *
 * @author wande
 */
public interface IProjectService {

    /**
     * 查询项目列表
     *
     * @param bo 查询条件
     * @param pageQuery 分页参数
     * @return 项目列表
     */
    TableDataInfo<ProjectVO> queryPageList(ProjectBo bo, PageQuery pageQuery);

    /**
     * 查询项目列表
     *
     * @param bo 查询条件
     * @return 项目列表
     */
    List<ProjectVO> queryList(ProjectBo bo);

    /**
     * 查询项目详情
     *
     * @param id 项目ID
     * @return 项目详情
     */
    ProjectVO queryById(Long id);

    /**
     * 创建项目
     *
     * @param bo 项目信息
     * @return 项目ID
     */
    Long createProject(ProjectBo bo);

    /**
     * 更新项目
     *
     * @param bo 项目信息
     * @return 是否成功
     */
    Boolean updateProject(ProjectBo bo);

    /**
     * 删除项目
     *
     * @param id 项目ID
     * @return 是否成功
     */
    Boolean deleteProject(Long id);

    /**
     * 归档项目
     *
     * @param id 项目ID
     * @return 是否成功
     */
    Boolean archiveProject(Long id);

    /**
     * 恢复项目
     *
     * @param id 项目ID
     * @return 是否成功
     */
    Boolean restoreProject(Long id);

    /**
     * 查询项目成员列表
     *
     * @param projectId 项目ID
     * @return 成员列表
     */
    List<ProjectMemberVO> queryMemberList(Long projectId);

    /**
     * 添加项目成员
     *
     * @param bo 成员信息
     * @return 是否成功
     */
    Boolean addMember(ProjectMemberBo bo);

    /**
     * 更新项目成员
     *
     * @param bo 成员信息
     * @return 是否成功
     */
    Boolean updateMember(ProjectMemberBo bo);

    /**
     * 删除项目成员
     *
     * @param id 成员ID
     * @return 是否成功
     */
    Boolean deleteMember(Long id);

    /**
     * 检查用户是否为项目成员
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 是否为成员
     */
    Boolean isMember(Long projectId, Long userId);

    /**
     * 检查用户权限
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @param requiredRole 所需角色
     * @return 是否有权限
     */
    Boolean hasPermission(Long projectId, Long userId, String requiredRole);

    /**
     * 获取项目资源统计
     *
     * @param projectId 项目ID
     * @return 资源统计
     */
    ProjectResourceStatisticsDTO getResourceStatistics(Long projectId);
}
